package com.sicheng.lc.lc笔试.神策篇;

import java.util.Scanner;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/8/21 21:09
 */
public class IPV6转数字 {
    /**
     * 大致题意有n行数据 (但不知道n是多少)
     * 计算每一行IPV6格式的串的10进制数是多少，但可能不满足格式
     * 不能以0开头  0可以使用省略写法  a.0.b=> a..b 但是开头和结尾不可以省略
     * 1.0.0.0.0.0.9===> 1......9或者1.....0.9等等情况
     * 每一部分是8个bit组成的10进制数 左边是高位右边是低位
     *
     * 输入可能含 !@等特殊字符
     * 输出  n行结果如果某行非法那一行输出-1
     *
     * 自己分析出：
     *  ipv6的合法格式 由点分割的为7部分 每一部分要么空要么 是数字
     *  当前部分合法就左移到对应的高位部分
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String s = sc.next();
            System.out.println(parse(s));
        }
    }

    static long parse(String s) {
        // 开头结尾不能是0或省略写法
        if (s.charAt(0) == '.' || s.charAt(s.length() - 1) == '.')
            return -1;
        String[] nums = s.split("\\.");
        // 必须被分为7部分 每部分的值[0,255] (11111111) = (1<<8)-1=255
        if (nums.length != 7)
            return -1;
        long res = 0;
        try {
            for (int i = 0; i < nums.length; i++) {
                long x;
                //这部分 很容易忽略解析出x=0时，如果i==0这就不合法了
                if (nums[i].length() == 0 || ((x = Integer.parseInt(nums[i])) == 0 && i != 0)) {
                    continue;
                } else if (x > 255 || x < 0 || x == 0) {
                    return -1;
                }
                // 当前x只是把这部分的10进制算出来 还要左移到对应的位上去
                // ________.________.________.________.________.________.________
                //     a.b.c.d.e.f.g
                //    算出x=g时不需要移位他就在自己对应的2进制位上
                //    算出x=f时 需要左移8位
                //    同理算出x=e时需要左移 16位
                res += x << (nums.length - i - 1) * 8;
            }
        } catch (Exception e) {
            // 解析x出异常就直接捕获异常得了 懒得特判了
            return -1;
        }
        return res;
    }
}
